package completablefuture;

import java.util.concurrent.CompletableFuture;

public class CompletableFutureDemo2 {
    /*
    2、任务依赖
        通过CompletableFuture提供的方法，可以方便地对任务进行链式操作，构建复杂的任务依赖关系。

        我们可以通过thenRun() 、thenAccept()、thenApply() 方法将前后任务连接起来，形成前后有依赖的任务链。其中：
            thenRun(Runnable runnable):     对异步任务的结果进行操作，不能传入参，也没有返回值。
            thenAccept(Consumer consumer):  对异步任务的结果进行消费，可以传入参，但没有返回值。
            thenApply(Function function):   对异步任务的结果进行转换，可传入参，返回一个新的CompletableFuture。

        使用 runAsync() 方法执行任务是没有返回值的，而通过 supplyAsync() 方法执行任务则支持返回值，可以通过 get() 和 join() 方法获取。
        两者区别是，get() 方法抛出检查时异常，程序必须进行处理，而 join() 方法抛出运行时异常，程序可不做处理。
    * */
    public static void main(String[] args) throws InterruptedException {
        CompletableFuture<Void> future1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("执行第一个任务");
            return 0;
        }).thenRun(() -> System.out.println("执行第二个任务"))
        .thenRun(() -> System.out.println("执行第二个任务"));

        Thread.sleep(200);

        CompletableFuture<Void> future2 = CompletableFuture.supplyAsync(() -> 5)
                .thenAccept(result-> System.out.println("任务执行结果："+ result*3))
                .thenAccept(result-> System.out.println("任务执行完成："+ result));

        Thread.sleep(200);

        CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> 5)
                .thenApply(result -> result * 3)
                .thenApply(result -> result + 3);
        System.out.println("future3="+future3.join());
    }
}
